<?php defined('SYSPATH') or die('No direct script access.');

abstract class Model_Review_Abstract extends ORM
{ 
    protected $_reload_on_wakeup = false;  
    
    const REVIEWS_PER_PAGE = 15; 
    
    /**
    * Вернуть Сущность - источник отзывов
    * 
    */
    abstract public function get_entity() ;
    
    /**
    * Получить запрос на выборку отзывов для юниона в общем классе
    * 
    */
    abstract public function get_reviews_query($entity) ;
    
    /**
    * put your comment there...
    * 
    * @param Model_Model | Model_Product $entity
    * @param mixed $page
    * @param mixed $get_count
    * @return $this
    */
    public function get_reviews($entity, $page = null, $get_count = false, $order_by = 'usefulness')
    {        
        // Если ищем по товару, а он не соотнесен к модели
        if ($entity instanceof Model_Product) {
            $model_id = $entity->model_id;
            if (!$entity->model_id) {
                // Продукт не соотнесен к модели, вернем пустой массив
                if ($get_count) {
                    return 0;    
                }
                return array();
            }   
        } else if ($entity instanceof Model_Model) {
            $model_id = $entity->id;
        } else {
            throw new Model_Exception('Некорректный тип');
        }
        
        if ($reviews = Cache::instance()->get($this->get_entity().'_reviews_'.$model_id.'_'.$page.'_'.$get_count.'_'.$order_by)) {
            return $reviews;
        } 
        
        $query = ORM::factory('review_'.$this->get_entity())
            ->where('model_id', '=', $model_id);
            
        if ($page) {
            $count = $this->get_reviews_per_page();
            $offset = ($page - 1) * $count;
            $query->offset($offset)->limit($count);    
        }
        
        if ($order_by) {
            $query->order_by($order_by, 'DESC');   
        }
        
        if ($get_count) {
            $count = $query->count_all();
            Cache::instance()->set($this->get_entity().'_reviews_'.$model_id.'_'.$page.'_'.$get_count.'_'.$order_by, $count); 
            return $count;   
        }
        $reviews = $query->find_all();
        Cache::instance()->set($this->get_entity().'_reviews_'.$model_id.'_'.$page.'_'.$get_count.'_'.$order_by, Model_Main::get_array($reviews)); 
        return $reviews;       
    }
    
    public function get_reviews_per_page()
    {
        return self::REVIEWS_PER_PAGE;
    }
    
    public function get_date()
    {
        $d = date('d', $this->date);
        $m = date('m', $this->date);
        $y = date('Y', $this->date);
        
        $months = array(
            '01' => 'января',
            '02' => 'февраля',
            '03' => 'марта',
            '04' => 'апреля',
            '05' => 'мая',
            '06' => 'июня',
            '07' => 'июля',
            '08' => 'августа',
            '09' => 'сентября',
            '10' => 'октября',
            '11' => 'ноября',
            '12' => 'декабря',
        );
        
        return $d . ' ' . $months[$m] . ' ' . $y;
    }
    
    public function get_usefulness()
    {
        $total = $this->u_yes + $this->u_no;
        if ($total == 0) {
            return 0;
        }
        
        return round(((($this->u_yes + 1.9208) / ($this->u_yes + $this->u_no) - 
            1.96 * sqrt(($this->u_yes * $this->u_no) / ($this->u_yes + $this->u_no) + 0.9604) / 
            ($this->u_yes + $this->u_no)) / (1 + 3.8416 / ($this->u_yes + $this->u_no))) * 10000); 
    }
    
    /*public function extract_reviews($products)
    {
        if ($products instanceof Model_Product) {
            $product = $products;
            $reviews = array();
            if ($product->model_id) {
                $reviews[$product->model_id] = ORM::factory('review', array('model_id' => $product->model_id));
            }  
        } else if (is_array(Model_Main::get_array($products))) {
            $reviews = array();
            foreach ($products as $product) {
                if (!in_array($product->model_id, $reviews) && $product->model_id) {
                    $reviews[] = $product->model_id;
                }    
            }            
            $reviews = ORM::factory('review')->where('model_id', 'IN', $reviews)->find_all();
            $reviews = Model_Main::process_array($reviews);             
        }
        return $reviews;
    }*/
    
}